package main
import (
	"fmt"
	"reflect"
)

type Msg struct{
	name string
	married bool
}

func main()  {
	//channel遵循 先进先出 原则
	var ch = make(chan interface{},3)
	//插入值
	ch <- "hello"
	ch <- true
	ch <- Msg{name: "hankai",married: false}
	fmt.Println(len(ch))
	//取值【没有取出来之前是不知道管道值类型的】
	x := <-ch
	fmt.Println("x::",x,reflect.TypeOf(x))
	y := <-ch
	fmt.Println("y::",y,reflect.TypeOf(y))
	z := <-ch
	fmt.Println("z",z.(Msg).name) //断言类型后再取值
	fmt.Println("z::",z,reflect.TypeOf(z))

	//拷贝赋值取值打印
	ch <- 1
	ch <- 2
	ch <- 3
	ch01 := ch
	fmt.Println(<-ch01) //1
	fmt.Println(<-ch01) //2
	ch01 <- 100
	fmt.Println(<-ch01) //3
	fmt.Println(<-ch) //100
	fmt.Println("==========")

	//管道的关闭与循环
	chan01 := make(chan int ,3)
	chan01 <- 1
	chan01 <- 2
	close(chan01)
	// chan01<-3  //关闭的管道不能再进行插入值
	fmt.Println(<-chan01)
	fmt.Println(<-chan01)
	// fmt.Println(<-chan01) //管道关闭后可以取值，不过取的值是该类型的零值
	x,ok:=<-chan01
	fmt.Println(x,ok) //0 false【0是int类型的零值，false表示管道已经关闭】

}